#include "board.h"
#include<QPainter>
#include<QMouseEvent>

board::board(QWidget *parent) : QWidget(parent)
{
      for(int i=0;i<32;i++){
          a[i].init(i);
      }
      //初始化棋子
      setlocation=-1;
      //初始化选中的棋子
}
void board::paintEvent(QPaintEvent *){
    QPainter painter(this);
    int d=40;//d为棋子直径
    r=d/2;
    //填充棋盘背景颜色
    painter.setBrush(QBrush(QColor(255,228,196)));
    painter.drawRect(d,d,8*d,9*d);
    //一共画十条横线
    for(int i=1;i<=10;i++){
        painter.drawLine(QPoint(d,i*d),QPoint(9*d,i*d));
    }
    //一共画九条竖线，但是中间有分界
    for(int i=1;i<=9;i++){
        if(i==9||i==1){
        painter.drawLine(QPoint(i*d,d),QPoint(i*d,10*d));
        }
        else{
            painter.drawLine(QPoint(i*d,d),QPoint(i*d,5*d));
            painter.drawLine(QPoint(i*d,6*d),QPoint(i*d,10*d));
        }
    }
    //画“将”“帅”所在格子
    painter.drawLine(QPoint(4*d,d),QPoint(6*d,3*d));
     painter.drawLine(QPoint(6*d,d),QPoint(4*d,3*d));
    painter.drawLine(QPoint(4*d,8*d),QPoint(6*d,10*d));
     painter.drawLine(QPoint(6*d,8*d),QPoint(4*d,10*d));
     //画32个棋子
     for(int i=0;i<32;i++){
         drawqizi(painter,i);
     }

}
QPoint board::locate(int row,int column){
    QPoint ret;
    ret.rx()=(column+1)*r*2;
    ret.ry()=(row+1)*r*2;
    return ret;
}
//获取坐标
QPoint board::locate(int loc){
    return locate(a[loc].row,a[loc].column);
}
//返回坐标值
void board::drawqizi(QPainter & painter,int loc){
    if(a[loc].dead){return;}//如果这个棋子被吃了，就不显示了，直接返回
    QPoint c=locate(loc);
    QRect rect=QRect(c.x()-r,c.y()-r,r*2,r*2);

    if(loc==setlocation){
        painter.setBrush(QBrush(QColor(205,133,63)));
    }
    else{
        painter.setBrush(QBrush(QColor(222,184,135)));
    }
    // 绘制棋子颜色

     painter.setPen(Qt::black);

    painter.drawEllipse(locate(loc),r,r);

    if(a[loc].color){
        painter.setPen(Qt::red);
    }
    painter.setFont(QFont("a",r,20));//调节字的大小
    painter.drawText(rect,a[loc].getText(),QTextOption(Qt::AlignCenter));
}//绘制棋子

bool board::getrowcolumn(QPoint p, int &row, int &column){
    for(row=0;row<=9;row++){
        for(column=0;column<=8;column++){
            QPoint c=locate(row,column);
            int x=c.x()-p.x();
            int y=c.y()-p.y();
            int distence=x*x+y*y;
            if(distence<r*r){
                return true;
            }
        }
    }
    return false;
}

bool board::ifmoveCHE(int setloc,int r,int c,int clickloc){
    return true;
}
bool board::ifmoveMA(int setloc,int r,int c,int clickloc){
     return true;
}
bool board::ifmovePAO(int setloc,int r,int c,int clickloc){
     return true;
}
bool board::ifmoveJIANG(int setloc,int r,int c,int clickloc){
    if(a[setloc].color){
        if(r>=3){
            return false;
        }
    }
    else{
        if(r<7){
            return false;
        }
    }
    if(c<3||c>5){
        return false;
    }
    int x=a[setloc].row-r;
    int y=a[setloc].column-c;
    int d=abs(x)*10+abs(y);
    if(d==1||d==10){
        return true;
    }
    else{
     return false;
    }
}
bool board::ifmoveBING(int setloc,int r,int c,int clickloc){
     return true;
}
bool board::ifmoveSHI(int setloc,int r,int c,int clickloc){
     return true;
}
bool board::ifmoveXIANG(int setloc,int r,int c,int clickloc){
     return true;
}

bool board::ifmove(int setloc,int r,int c,int clickloc){
    if(a[setloc].color==a[clickloc].color){
        setlocation=clickloc;
        update();//换成另一个棋子走
        return false;//颜色相同的棋子不能走
    }
    switch(a[setloc].type){
    case qizi::CHE:
        return ifmoveCHE(setloc,r,c,clickloc);
        break;
    case qizi::MA:
         return ifmoveMA(setloc,r,c,clickloc);
         break;
    case qizi::JIANG:
         return ifmoveJIANG(setloc,r,c,clickloc);
         break;
    case qizi::PAO:
         return ifmovePAO(setloc,r,c,clickloc);
         break;
    case qizi::BING:
         return ifmoveBING(setloc,r,c,clickloc);
         break;
    case qizi::SHI:
         return ifmoveSHI(setloc,r,c,clickloc);
         break;
    case qizi::XIANG:
         return ifmoveXIANG(setloc,r,c,clickloc);
         break;
    }
    return true;
}

void board::mouseReleaseEvent(QMouseEvent *ev){
    QPoint p=ev->pos();
    //将p变成象棋棋子的位置
    //判断现在这个位置上有没有棋子
    int row,column;
    bool b=getrowcolumn(p,row,column);
    if(b==false){
        return;
    }//没点在应该可以放棋子的地方
    int i;
    int clicklocation=-1;
    for(i=0;i<32;i++){
    if(a[i].row==row&&a[i].column==column&&a[i].dead==false){
        break;
    }
}
    if(i<32){
       clicklocation=i;
    }//标记棋子
    if(setlocation==-1){
        if(clicklocation!=-1){
            setlocation=clicklocation;
            update();
        }
    }//选中棋子
    else{
        if(ifmove(setlocation,row,column,clicklocation)){
        a[setlocation].row=row;
        a[setlocation].column=column;
        if(clicklocation!=-1){
            a[clicklocation].dead=true;
        }
        setlocation=-1;
          update();
        }
    }//移动棋子

}
